package stack;

import java.util.*;

public class expr {
    public static void main(String[] args) {
       int a = solve2("100+100");
        System.out.println(a);
    }

    /**
     * 2
     */
    public static int solve2(String s) {
        // write code here
        Stack<Integer> math = new Stack<>();
        Stack<Character> single = new Stack<>();
        int i = 0;
        int n = s.length();
        while(i < n-1) {
            int flg = 0;
            int num = 0;

            if(s.charAt(i) >='0' &&s.charAt(i) <= '9'){//计算数字，标记 flag 为1
                num = 0;
                int dex = 1;
                while(s.charAt(i) >='0' &&s.charAt(i) <= '9') {
                    num += dex*(s.charAt(i)-'0');
                    dex *= 10;
                    i++;
                }
                flg = 1;
            }

            if(flg == 1){//flg == 1 上一步是计算数字的，存入 math 栈中

                math.push(num);
                i--;
            }else {//符号，如果是* ) 时则开始计算，其余符号则入栈
                if(s.charAt(i) == '+' || s.charAt(i) == '-' || s.charAt(i) == '('){
                    //+ - ( 入栈
                    single.push(s.charAt(i));
                }
                if(s.charAt(i) == '*') {//是 *
                    //看single中栈顶符号是否是 '(' ，不是'(' 则直接计算,计算之后的结果再入栈
                    if(single.isEmpty() || single.peek() != '(' || single.peek() == '*'){
                        int a = s.charAt(i+1)-'0';
                        int b = math.pop();
                        math.push(a*b);
                    }else {
                        single.push(s.charAt(i));
                    }
                }
                if(s.charAt(i) == ')'){//是 ) ，则先后取两次math 和 single 计算后，结果入math
                    while(!single.isEmpty() && single.peek() != '('){
                        int a = math.pop();//符号后面的数
                        int b = math.pop();//符号前面的数
                        char c = single.pop();
                        if(c == '+') {
                            math.push(b+a);
                        }
                        if(c == '-'){
                            math.push(b-a);
                        }
                        if(c == '*'){
                            math.push(a*b);
                        }
                    }
                    single.pop();//弹出 (

                }
            }
            i++;
        }
        //检查 single 栈是否为空，不为空则还有运算没有进行
        while(!single.isEmpty()){
            int a = math.pop();//符号后面的数
            int b = math.pop();//符号前面的数
            char c = single.pop();
            if(c == '+') {
                math.push(b+a);
            }
            if(c == '-'){
                math.push(b-a);
            }
            if(c == '*'){
                math.push(a*b);
            }
        }


        return math.pop();
    }


    /**
     * 1
     * @param s
     * @return
     */
    public static int solve (String s) {
        // write code here
        Stack<Integer> math = new Stack<>();
        Stack<Character> single = new Stack<>();
        int i = 0;
        int n = s.length();
        while(i < n-1) {
            if(s.charAt(i) >='0' &&s.charAt(i) <= '9'){//数字，存入 math 栈中
                math.push(s.charAt(i)-'0');
            }else {//符号，如果是* ) 时则开始计算，其余符号则入栈
                if(s.charAt(i) == '+' || s.charAt(i) == '-' || s.charAt(i) == '('){
                    //+ - ( 入栈
                    single.push(s.charAt(i));
                }
                if(s.charAt(i) == '*') {//是 *
                    //看single中栈顶符号是否是 '(' ，不是'(' 则直接计算,计算之后的结果再入栈
                    if(single.isEmpty() || single.peek() != '(' || single.peek() == '*'){
                        int a = s.charAt(i+1)-'0';
                        int b = math.pop();
                        math.push(a*b);
                    }else {
                        single.push(s.charAt(i));
                    }
                }
                if(s.charAt(i) == ')'){//是 ) ，则先后取两次math 和 single 计算后，结果入math
                    while(!single.isEmpty() && single.peek() != '('){
                        int a = math.pop();//符号后面的数
                        int b = math.pop();//符号前面的数
                        char c = single.pop();
                        if(c == '+') {
                            math.push(b+a);
                        }
                        if(c == '-'){
                            math.push(b-a);
                        }
                        if(c == '*'){
                            math.push(a*b);
                        }
                    }
                    single.pop();//弹出 (

                }

            }
            i++;
        }
        //检查 single 栈是否为空，不为空则还有运算没有进行
        while(!single.isEmpty()){
            int a = math.pop();//符号后面的数
            int b = math.pop();//符号前面的数
            char c = single.pop();
            if(c == '+') {
                math.push(b+a);
            }
            if(c == '-'){
                math.push(b-a);
            }
            if(c == '*'){
                math.push(a*b);
            }
        }


        return math.pop();
    }
}
